#include <bits/stdc++.h>
using namespace std;
 
int main() {
    // 产品数, 总投资, 总风险
    int m, n, x;
    cin >> m >> n >> x;
 
    // 产品回报率序列
    vector<int> back(m);
    for (int i = 0; i < m; i++) cin >> back[i];
 
    // 产品风险值序列
    vector<int> risk(m);
    for (int i = 0; i < m; i++) cin >> risk[i];
 
    // 产品投资额序列
    vector<int> invest(m);
    for (int i = 0; i < m; i++) cin >> invest[i];
 
    // 记录所选产品的最大投资回报
    int max_invest_back = 0;
    // 记录所选产品的最大投资回报对应的风险值
    int max_invest_back_risk = INT_MAX;
 
    // 记录所选产品的序号
    map<int, int> select;
 
    for (int i = 0; i < m; i++) {
        // 如果单个产品的投资风险未超过总风险，则投资单个产品
        if (risk[i] <= x) {
            // 产品I的投资额不能超过该产品的最大投资额，以及总投资
            int investI = min(invest[i], n);
            // 产品投资回报
            int invest_back = investI * back[i];
 
            // 如果投资回报高于最优策略，那么选择该产品
            // **特别注意** 如果投资回报等于最优策略，那么继续比较风险值，如果风险值更小，则选择该产品
            if (invest_back > max_invest_back || (invest_back == max_invest_back && risk[i] < max_invest_back_risk)) {
                max_invest_back = invest_back;
                max_invest_back_risk = risk[i];
 
                select.clear();
                select[i] = investI;
            }
        } else {
            continue;
        }
 
        for (int j = i + 1; j < m; j++) {
            // 如果两个产品的风险和不超过了总风险，那么两个产品都选
            if (risk[i] + risk[j] <= x) {
                int investI; // 产品I的投资额
                int investJ; // 产品J的投资额
 
                // 其中优先投资回报率大的
                if (back[i] > back[j]) {
                    // 产品I回报率高，则能投多少投多少，最多不能超过min(总投资, 产品I的最多投资额)
                    investI = min(n, invest[i]);
                    // 留给产品J的剩余钱未 n - investI, 而产品J最多投资invest[j]，因此取二者较小值
                    investJ = min(n - investI, invest[j]);
                } else if (back[i] < back[j]) {
                    // 产品J回报率高，则能投多少投多少，最多不能超过min(总投资, 产品J的最多投资额)
                    investJ = min(n, invest[j]);
                    investI = min(n - investJ, invest[i]);
                } else if (risk[i] > risk[j]) {
                    // **特别注意**  产品I和产品J回报率相同，则看谁的风险值更小，如果产品J的风险值更小，则能投多少投多少
                    investJ = min(n, invest[j]);
                    investI = min(n - investJ, invest[i]);
                } else {
                    // **特别注意**  产品I和产品J回报率相同，则看谁的风险值更小，如果产品I的风险值更小，则能投多少投多少
                    investI = min(n, invest[i]);
                    investJ = min(n - investI, invest[j]);
                }
 
                // 总投资回报
                int invest_back = investI * back[i] + investJ * back[j];
                // 总风险值
                int invest_back_risk = risk[i] + risk[j];
 
                // 如果当前产品组合的总回报更大，则选当前组合产品
                // **特别注意** 如果投资回报等于最优策略，那么继续比较风险值，如果风险值更小，则选择该产品
                if (invest_back > max_invest_back ||
                    (invest_back == max_invest_back && invest_back_risk < max_invest_back_risk)) {
                    max_invest_back = invest_back;
                    max_invest_back_risk = invest_back_risk;
 
                    select.clear();
                    if (investI > 0) select[i] = investI;
                    if (investJ > 0) select[j] = investJ;
                }
            }
        }
    }
 
    for (int i = 0; i < m; i++) {
        if (select.count(i) > 0) {
            cout << select[i] << " ";
        } else {
            cout << "0 ";
        }
    }
 
    cout << endl;
 
    return 0;
}